package JVM.第02篇_类的加载篇;

/**
 *  类装载器   classLoader   class文件在文件开头有特定的文件标示 cafe babe
 *  虚拟机自带加载器：
 *  1. 启动类加载器 （Bootstrap）  c++（根加载器）镶嵌在 JVM内部
 *  2. 扩展类加载器（Extension)   java  PlatformClassLoader
 *  3. 应用程序类加载器 （AppClassLoader）
 *     Java也叫系统类加载器，加载当前应用的classpath的所有类
 *
 *  用户自定义加载类
 *  Java.lang.ClassLoader 的子类
 *
 *  ● 在Java的日常应用程序开发中，类的加载几乎是由上述3种类加载器相互配合执行的。
 *    在必要时，我们还可以自定义类加载器，来定制类的加载方式。
 *  ● 体现Java语 言强大生 命力和巨大魅力的关键因素之一便是,
 *    Java开发者可以自定义类加载器来实现类库的动态加载，
 *    加载源可以是本地的JAR包，也可以是网络上的远程资源。
 *  ● 通过类加载器可以实现非常绝妙的插件机制，这方面的实际应用案例举不胜举。
 *    例如，著名的OSGI组件框架，再如Eclipse的插件机制。
 *    类加载器为应用程序提供了一种动态增加新功能的机制，
 *    这种机制无须重新打包发布应用程序就能实现。
 *  ● 同时，白定义加载器能够实现应用隔离，
 *    例如Tomcat, Spring等中间件和组件框架都在内部实现了自定义的加载器，
 *    并通过自定义加载器隔离不同的组件模块。
 *    这种机制比C/C++程序要好太多，想不修改C/C++程序就能为其新增功能，几乎是不可能的，
 *    仅仅一个兼容性便能阻挡住所有美好的设想。
 *  ● 所有用户自定义类加载器通常需耍继承于抽象类java.lang.ClassLoader.
 *
 *
 */
public class B3_类装载器分类 {

    public static void main(String[] args) {
        //获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();
        System.out.println(systemClassLoader);
        //获取扩展类加载器
        ClassLoader parent = systemClassLoader.getParent();
        System.out.println(parent);
        //启动类加载器（引导类加载器）
        ClassLoader bootstrap = parent.getParent();
        System.out.println(bootstrap);

        //        sun.misc.Launcher//JVM的入口
        Object object =new Object();
        //System.out.println(object.getClass().getClassLoader().getParent().getParent());
        //System.out.println(object.getClass().getClassLoader().getParent());//Bootstrap  没有更上一级的加载器了 会报错
        System.out.println(object.getClass().getClassLoader());//Bootstrap 根加载器 无（由于Bootstrap是c++   所以为null）

        B3_类装载器分类 jvm=new B3_类装载器分类();
        System.out.println(jvm.getClass() == B3_类装载器分类.class);//true

        System.out.println(jvm.getClass().getClassLoader().getParent().getParent());//jvm的上上一个装载
        System.out.println(jvm.getClass().getClassLoader().getParent());//jvm的上一个装载器
        System.out.println(jvm.getClass().getClassLoader());//jvm是谁装载的

    }
}
